"""
定义了与 Tool 模型相关的 Pydantic schema。

这些 schema 用于：
1. API 请求体验证 (例如，创建工具时的数据)。
2. API 响应体序列化 (例如，从数据库返回工具数据)。
"""
from pydantic import BaseModel, HttpUrl, field_validator
from typing import Optional, Dict, Any
from uuid import UUID
import datetime

class ToolBase(BaseModel):
    """工具模型的基础 schema，包含所有工具共有的字段。"""
    name: str
    description: Optional[str] = None
    target_api_url: str  # 改为字符串类型以避免自动添加斜杠
    openapi_spec_content: str
    authentication_headers: Optional[Dict[str, Any]] = None
    filter_dsl: Optional[str] = None
    # 添加MCP技术名称映射字段
    mcp_tool_names: Optional[Dict[str, str]] = {}
    
    @field_validator('target_api_url')
    @classmethod
    def validate_target_api_url(cls, v: str) -> str:
        """验证并标准化target_api_url"""
        if not v:
            raise ValueError('target_api_url不能为空')
        
        # 基本URL格式验证
        if not (v.startswith('http://') or v.startswith('https://')):
            raise ValueError('target_api_url必须以http://或https://开头')
        
        # 去除末尾的斜杠以避免双斜杠问题
        return v.rstrip('/')
    
    @field_validator('target_api_url', mode='before')
    @classmethod
    def convert_httpurl_to_string(cls, v):
        """如果输入是HttpUrl类型，转换为字符串并去除末尾斜杠"""
        if hasattr(v, '__str__'):
            return str(v).rstrip('/')
        return v

class ToolCreate(ToolBase):
    """用于创建新工具时，API 请求体的 schema。"""
    pass

class ToolUpdate(BaseModel):
    """用于更新现有工具时，API 请求体的 schema。"""
    name: Optional[str] = None
    description: Optional[str] = None
    target_api_url: Optional[str] = None
    openapi_spec_content: Optional[str] = None
    authentication_headers: Optional[Dict[str, Any]] = None
    filter_dsl: Optional[str] = None
    # 添加MCP技术名称映射字段
    mcp_tool_names: Optional[Dict[str, str]] = None

class ToolInDB(ToolBase):
    """代表存储在数据库中的工具模型，通常用作 API 响应体。

    它在 ToolBase 的基础上增加了数据库自动生成的字段 (id, created_at, updated_at)。
    """
    id: UUID
    created_at: datetime.datetime
    updated_at: datetime.datetime

    class Config:
        """Pydantic 配置类，用于与 ORM 模型集成。"""
        # 允许 Pydantic 模型从 ORM 对象的属性中读取数据。
        from_attributes = True